package com.dp1.pucp.Seguridad.DAO;

import com.dp1.pucp.Modelo.Clases.Perfil;
import com.dp1.pucp.Modelo.Clases.Rol;
import com.dp1.pucp.Modelo.Clases.Rolxperfil;
import com.dp1.pucp.Util.HibernateUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class PerfilDAO {

    public Perfil guardarPerfil(Perfil perfil) {
        int cod = 0;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.saveOrUpdate(perfil);
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.persist(perfil);

            cod = perfil.getIdperfil();

            Perfil p = new Perfil();
            List list = session.createQuery("from Perfil where idperfil =" + cod + " order by idperfil").list();

            Iterator iter = list.iterator();
            while (iter.hasNext()) {
                p = (Perfil) iter.next();
                Hibernate.initialize(p.getIdperfil());
                Hibernate.initialize(p.getNombre());

            }
            session.close();
            return p;
        }
    }

    public void guardarRolxPerfil(Rolxperfil rolxperfil) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.saveOrUpdate(rolxperfil);
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            tx.commit();
            session.close();
        }

    }

    public void eliminarRolxperfil(Rolxperfil rxp) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(rxp);
            session.flush();
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);

        } finally {
            session.close();
        }
    }

    public ArrayList<String> listarEstado() {
        ArrayList<String> estados = new ArrayList<>();
        estados.add("Seleccionar");
        estados.add("ACTIVO");
        estados.add("INACTIVO");
        return estados;
    }
    
    public ArrayList<String> listarModulos(){
        ArrayList<String> modulos = new ArrayList<>();
        modulos.add("Todos"); //0
        modulos.add("Administración"); //1
        modulos.add("Compras"); //2
        modulos.add("Logística"); //3
        modulos.add("Ventas"); //4
        modulos.add("Producción"); //5
        modulos.add("Seguridad"); //6
        return modulos;
    }

    public ArrayList<Perfil> listarPerfil() {
        ArrayList<Perfil> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
//        nombre = nombre.toUpperCase();
        try {
            List lista;
//            if (nombre.equals("")) { //no hay nombre
//                if (estado != 0)//segun estado sin nombre
//                {
//                    lista = session.createQuery("from Perfil where estado = " + estado + " order by idperfil").list();
//                } else //todos sin nombre
//                {
//                    lista = session.createQuery("from Perfil order by idperfil").list();
//                };
//            } else { //hay nombre
//                if (estado != 0) //segun estado con nombre
//                {
//                    lista = session.createQuery("from Perfil where estado = " + estado + " and Upper(nombre) like '%" + nombre + "%' order by idperfil").list();
//                } else //todos cn nombre
//                {
//                    lista = session.createQuery("from Perfil where Upper(nombre) like '%" + nombre + "%' order by idperfil").list();
//                };
//            }

            lista = session.createQuery("from Perfil order by idperfil").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Perfil c = (Perfil) iter.next();
                Hibernate.initialize(c.getNombre());
                Hibernate.initialize(c.getDescripcion());
                Hibernate.initialize(c.getEstado());
                listaResultados.add(c);
            }
            tx.commit();

        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }

    public ArrayList<Rolxperfil> listarRolxPerfil(Perfil perfil) {
        ArrayList<Rolxperfil> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Rolxperfil where idperfil=" + perfil.getIdperfil() + " order by idrolxperfil").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Rolxperfil l = (Rolxperfil) iter.next();
                Hibernate.initialize(l.getIdrolxperfil());
                Hibernate.initialize(l.getFechaRegistro());
                Hibernate.initialize(l.getPerfil());
                Hibernate.initialize(l.getRol());
                listaResultados.add(l);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }

    }

    public ArrayList<Rol> listarRol(String codigo, String pestaña) {
        codigo = codigo.toUpperCase();
        pestaña = pestaña.toUpperCase();

        ArrayList<Rol> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            List list;

            if (codigo.equals("")) {
                if (pestaña.equals("")) {
                    list = session.createQuery("from Rol  order by pestana").list();
                } else {
                    list = session.createQuery("from Rol where upper(pestana) like '%" + pestaña + "%' order by pestana").list();
                }
            } else {
                if (pestaña.equals("")) {
                    list = session.createQuery("from Rol where upper(codigo) like '%" + codigo + "%' order by pestana").list();

                } else {
                    list = session.createQuery("from Rol where upper(codigo) like '%" + codigo + "%' and  upper(pestana) like '%" + pestaña + "%' order by pestana").list();
                }
            }



            Iterator iter = list.iterator();
            while (iter.hasNext()) {
                Rol r = (Rol) iter.next();
                Hibernate.initialize(r.getIdrol());
                Hibernate.initialize(r.getCodigo());
                Hibernate.initialize(r.getDescripcion());
                Hibernate.initialize(r.getFechaIngreso());
                Hibernate.initialize(r.getPestana());
                Hibernate.initialize(r.getVentana());


                listaResultados.add(r);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }
}
